﻿using System;
using System.Threading;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;


namespace Yedekleyici
{
  

    public partial class Form1 : Form
    {
        enum Yapilacak_İşler { Bekleme = 0, Sayma_Hazirlik, Sayma, tarihsel_karşilaştir, crc_karşilaştir, yedekle, fazla_dosyaları_sil };
        static Yapilacak_İşler Yapilacak_İşler_Sayaç = 0;

        const int Türler_DosyaSayisiniBulan_Klasör = 0;
        const int Türler_DosyaSayisiniBulan_Dosya = 1;

        const string sw_ver = "Mup Yedekleyici 1.01";
        public string[] AyiristirlmişSonuç = new string[2];
        string[] OkunanTalep;
        public string ProgramAyarlarYolu;
        int ToplamTalepSayisi;

        //dosya sayma thread
        static bool KapatThread_DosyaSayisiniBulan = false;
        static string Hedef_DosyaSayisiniBulan = "Bitti";
        static int[] Sonuclar_DosyaSayisiniBulan = new int[2];

        //tarihsel karsılastıran thread
        static bool KapatThread_TarihselKarşilaştiran = false;
        static string Hedef_TarihselKarşilaştiran = "Bitti";

        public Form1()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            switch(Yapilacak_İşler_Sayaç)
            {
                case (Yapilacak_İşler.Bekleme):
                    break;

                case (Yapilacak_İşler.Sayma_Hazirlik):
                    timer1.Interval = 100;

                    GosterTalepBilgileri(0);
                    KapatThread_DosyaSayisiniBulan = false;
                    Hedef_DosyaSayisiniBulan = textBox1.Text;

                    DosyaSayisiniBulan Object_DosyaSayisiniBulan = new DosyaSayisiniBulan();
                    Thread Thread_DosyaSayisiniBulan = new Thread(Object_DosyaSayisiniBulan.DosyaSayisiniBul);
                    Thread_DosyaSayisiniBulan.Start();
                    Yapilacak_İşler_Sayaç++;
                    break;

                case (Yapilacak_İşler.Sayma):
                    if (Hedef_DosyaSayisiniBulan == "Bitti")
                    {
                        Yapilacak_İşler_Sayaç++;
                        progressBar1.Maximum = Sonuclar_DosyaSayisiniBulan[Türler_DosyaSayisiniBulan_Dosya]; 
                        progressBar1.Value = 0;
                        progressBar2.Maximum = Sonuclar_DosyaSayisiniBulan[Türler_DosyaSayisiniBulan_Dosya];
                        progressBar2.Value = 0;
                        progressBar3.Maximum = Sonuclar_DosyaSayisiniBulan[Türler_DosyaSayisiniBulan_Dosya];
                        progressBar3.Value = 0;
                        progressBar4.Maximum = Sonuclar_DosyaSayisiniBulan[Türler_DosyaSayisiniBulan_Dosya];
                        progressBar4.Value = 0;
                        progressBar5.Maximum = Sonuclar_DosyaSayisiniBulan[Türler_DosyaSayisiniBulan_Dosya];
                        progressBar5.Value = 0;

                        KapatThread_TarihselKarşilaştiran = false;
                        Hedef_DosyaSayisiniBulan == "Bitti"
                        TarihselKarşilaştiran Object_TarihselKarşilaştiran = new TarihselKarşilaştiran();
                        Thread Thread_TarihselKarşilaştiran = new Thread(Object_TarihselKarşilaştiran.TarihselKarşilaştir);
                        Thread_TarihselKarşilaştiran.Start();
                        Yapilacak_İşler_Sayaç++;
                    }
                    break;
            }
        }

        public class DosyaSayisiniBulan
        {
            const int Türler_DosyaSayisiniBulan_Klasör = 0;
            const int Türler_DosyaSayisiniBulan_Dosya = 1;

            public void DosyaSayisiniBul()
            {
                while (!KapatThread_DosyaSayisiniBulan)
                {
                    while (Hedef_DosyaSayisiniBulan == "Bitti") System.Threading.Thread.Sleep(2000);

                    Sonuclar_DosyaSayisiniBulan[Türler_DosyaSayisiniBulan_Klasör] = 0;
                    Sonuclar_DosyaSayisiniBulan[Türler_DosyaSayisiniBulan_Dosya] = 0;

                    if(Directory.Exists(Hedef_DosyaSayisiniBulan)) ProcessDirectory(Hedef_DosyaSayisiniBulan);
                    Hedef_DosyaSayisiniBulan = "Bitti";
                }

            }

            public static void ProcessDirectory(string targetDirectory)
            {
                string[] fileEntries = Directory.GetFiles(targetDirectory);
                foreach (string fileName in fileEntries) Sonuclar_DosyaSayisiniBulan[Türler_DosyaSayisiniBulan_Dosya]++;

                string[] subdirectoryEntries = Directory.GetDirectories(targetDirectory);
                foreach (string subdirectory in subdirectoryEntries)
                {
                    Sonuclar_DosyaSayisiniBulan[Türler_DosyaSayisiniBulan_Klasör]++;
                    ProcessDirectory(subdirectory);
                }
            }
        }

        public class TarihselKarşilaştiran
        {
            public void TarihselKarşilaştir()
            {
                while (!KapatThread_TarihselKarşilaştiran)
                {
                   

                }
            }
        }

        public void Kapat_Threadler()
        {
            KapatThread_DosyaSayisiniBulan = true;
            KapatThread_TarihselKarşilaştiran = true;
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            System.DateTime dates_simdi = new System.DateTime();
            System.DateTime date_terhis = new System.DateTime(2011, 05, 05, 09, 20, 10);
            dates_simdi = DateTime.Now;
            System.TimeSpan fark = dates_simdi.Subtract(date_terhis);

            this.Text = sw_ver + " " + fark.Days;

            ProgramAyarlarYolu = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) + "\\Mup Yedekleyici\\";
            Directory.CreateDirectory(ProgramAyarlarYolu);

            DoldurTalepListesi();
            GosterTalepBilgileri(0);
        }

        private void button4_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
            KlasörAdiniAyriştir(openFileDialog1.FileName);
            textBox1.Text = AyiristirlmişSonuç[0];
        }

        public void KlasörAdiniAyriştir(string yol)
        {
            AyiristirlmişSonuç[0] = System.IO.Path.GetDirectoryName(yol);
            AyiristirlmişSonuç[0] += "\\";
            AyiristirlmişSonuç[1] = System.IO.Path.GetFileName(yol);
        }

        private void button5_Click(object sender, EventArgs e)
        {
            openFileDialog1.ShowDialog();
            KlasörAdiniAyriştir(openFileDialog1.FileName);
            textBox2.Text = AyiristirlmişSonuç[0];
        }

        private void button6_Click(object sender, EventArgs e)
        {
            YazTalep("Evet");
            DoldurTalepListesi();
            GosterTalepBilgileri(0);
        }

        public bool GosterTalepBilgileri(int no)
        {
            if (ToplamTalepSayisi == 0) return false;

            try
            {
                OkunanTalep = textBox4.Text.Split('?');
                if (no >= OkunanTalep.Length) return false;

                OkunanTalep = OkunanTalep[no].Split(';');
                if (OkunanTalep[0] != "MupYedekleyici") return false;
                if (OkunanTalep[10] != "MupYedekleyici") return false;

                label14.Text = "Son Yedekleme Zamanı " + OkunanTalep[1];
                textBox3.Text = OkunanTalep[2];
                textBox1.Text = OkunanTalep[3];
                textBox2.Text = OkunanTalep[4];
                numericUpDown1.Value = Convert.ToInt16(OkunanTalep[5]);
                if (OkunanTalep[6] == "Evet")   checkBox2.Checked = true;
                else                            checkBox2.Checked = false;
                if (OkunanTalep[7] == "Evet")   checkBox1.Checked = true;
                else                            checkBox1.Checked = false;
                numericUpDown2.Value = Convert.ToInt16(OkunanTalep[8]);

                if (OkunanTalep[9] == "Evet")   return true;
                else                            return false;
            }

            catch (Exception ex)
            {
                YazLog("GosterTalepBilgileri " + Convert.ToString(ex));
                return false;
            }
        }

        public void SilTalep(int no)
        {
            if (ToplamTalepSayisi == 0) return;

            try
            {
                OkunanTalep = textBox4.Text.Split('?');
                if (no >= OkunanTalep.Length-1) return;

                File.Delete(ProgramAyarlarYolu + "\\Talepler.csv");
                using (System.IO.StreamWriter file = new System.IO.StreamWriter(ProgramAyarlarYolu + "\\Talepler.csv", true))
                {
                    for (int i = 0; i<ToplamTalepSayisi; i++)
                    {
                        if (no != i) file.WriteLine(OkunanTalep[i] + "?");
                    }
                }
            }

            catch (Exception ex)
            {
                YazLog("SilTalep " + Convert.ToString(ex));
            }
        }

        public void DoldurTalepListesi()
        {
            try
            {
                textBox4.Text = "";
                ToplamTalepSayisi = 0;
                using (System.IO.StreamReader file = new System.IO.StreamReader(ProgramAyarlarYolu + "\\Talepler.csv"))
                {
                    string okunan = file.ReadLine();
                    while (okunan != null) 
                    {
                        textBox4.Text += okunan;
                        ToplamTalepSayisi++;

                        okunan = file.ReadLine();
                    }
                }

                checkedListBox1.Items.Clear();
                for (int i = 0; i < ToplamTalepSayisi; i++)
                {
                    bool durum = GosterTalepBilgileri(i);
                    checkedListBox1.Items.Add(OkunanTalep[2], durum);
                }
            }

            catch (Exception ex)
            {
                YazLog("DoldurTalepListesi " + Convert.ToString(ex));
            }
        }

        private bool YazTalep(string TalepDurumu)
        {
            try
            {
                DateTime saveNow = DateTime.Now;
                using (System.IO.StreamWriter file = new System.IO.StreamWriter(ProgramAyarlarYolu + "\\Talepler.csv", true))
                {
                    string dd = "MupYedekleyici;" + saveNow.ToString() + ";";
                    dd += textBox3.Text + ";";
                    dd += textBox1.Text + ";";
                    dd += textBox2.Text + ";";
                    dd += Convert.ToString(numericUpDown1.Value) + ";";
                    if (checkBox2.Checked)  dd += "Evet;";
                    else                    dd += "Hayir;";
                    if (checkBox1.Checked)  dd += "Evet;";
                    else                    dd += "Hayir;";
                    dd += Convert.ToString(numericUpDown2.Value) + ";";
                    dd += TalepDurumu + ";";
                    dd += "MupYedekleyici?";

                    file.WriteLine(dd);
                }
                return true;
            }

            catch (Exception ex)
            {
                YazLog("YazTalep " + Convert.ToString(ex));
            }
            return false;
        }

        private bool YazLog(string mesaj)
        {
            try
            {
                DateTime saveNow = DateTime.Now;
                using (System.IO.StreamWriter file = new System.IO.StreamWriter(ProgramAyarlarYolu + "\\Hatalar.csv", true))
                {
                    string dd = saveNow.ToString() + ";" + mesaj;
                    file.WriteLine(dd);
                }
                return true;
            }

            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
            return false;
        }

        private void checkedListBox1_Click(object sender, EventArgs e)
        {
            GosterTalepBilgileri(checkedListBox1.SelectedIndex);
        }

        private void button7_Click(object sender, EventArgs e)
        {
            if (checkedListBox1.SelectedIndex == -1) return;
            SilTalep(checkedListBox1.SelectedIndex);
            DoldurTalepListesi();
            GosterTalepBilgileri(0);
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (checkedListBox1.Items.Count == 0) return;
            if (Yapilacak_İşler_Sayaç != Yapilacak_İşler.Bekleme) return; 

            Yapilacak_İşler_Sayaç = Yapilacak_İşler.Sayma_Hazirlik;
        } 
    }
}
